package FooBarBibliotheque;

import java.io.Serializable;
import java.util.GregorianCalendar;

/* @authors vasquezs, haffafa, baldinof */
public class Exemplaire implements Serializable {

    private static final long serialVersionUID = 1L;
    private int numeroSequentiel;
    private GregorianCalendar dateReception;
    private Ouvrage ouvrage;
    private TypeExemplaire typeExemplaire;
    private Emprunt emprunt;

    public Exemplaire(Ouvrage o, int numSeq, GregorianCalendar date, TypeExemplaire typeExemplaire, GregorianCalendar dateParution) {
        setNumeroSequentiel(numSeq);
        setDateReception(date,dateParution);
        setTypeExemplaire(typeExemplaire);
        lierOuvrage(o);
    }

    public Exemplaire() {
        emprunt = null;
    }

    public TypeExemplaire getTypeExemplaire() {
        return typeExemplaire;
    }

    public void setTypeExemplaire(TypeExemplaire typeExemplaire) {
        this.typeExemplaire = typeExemplaire;
    }

    public GregorianCalendar getDateReception() {
        return dateReception;
    }

    public void setDateReception(GregorianCalendar dateReception, GregorianCalendar dateParution) {
        this.dateReception = dateParution;
        if (dateReception.after(this.dateReception)) {
            this.dateReception = dateReception;
        }
    }

    public int getNumeroSequentiel() {
        return numeroSequentiel;
    }

    public void setNumeroSequentiel(int numeroSequentiel) {
        this.numeroSequentiel = numeroSequentiel;
    }

    public Ouvrage getOuvrage() {
        return ouvrage;
    }

    public void setOuvrage(Ouvrage ouvrage) {
        this.ouvrage = ouvrage;
    }

    private void lierOuvrage(Ouvrage o) {
        ouvrage = o;
    }

    @Override
    public String toString() {
        return "Numéro sequentiel: " + String.valueOf(numeroSequentiel) + "\nType de exemplaire:" + typeExemplaire;
    }

    public boolean etatEprumtable() {
        return typeExemplaire == TypeExemplaire.empruntable && emprunt == null;
    }

    void lierEmprumtExemplaire(Emprunt e) {
        emprunt = e;
    }

    public void rendreExemplaire() {
        Emprunt m = unEmprunt();
        if (m != null) {
            m.rendreExemplaire(this);
            delierEmprunt(m);
        } else {
            EntreSortie.afficherMessage("Exemplaire non-emprunte");
        }
    }

    private Emprunt unEmprunt() {
        return emprunt;
    }

    private void delierEmprunt(Emprunt m) {
        m = null;
    }

    String infoExemplaire() {
        Ouvrage o = unOuvrage();
        return "Numéro séquentiel: " + numeroSequentiel + "\n" + o.infoOuvrageSimple();
    }

    private Ouvrage unOuvrage() {
        return ouvrage;
    }

    public boolean etatEprumte() {
        return typeExemplaire == TypeExemplaire.empruntable && emprunt != null;
    }

    public String infoEmprunt() {
        return emprunt.infoLecteur();
    }
}
